15.4 遍历文件树

和Groovy一样,Kotlin也提供了方便的功能来遍历文件树。遍历文件树需要调用扩展方法walk()。它会返回一个FileTreeWalk对象,它有一些方法用于设置遍历方向和深度,详情参见FileTreeWalk API 文档说明。

提示:FileTreeWalk API 文档链接

下面的例子遍历了指定文件夹下的所有文件。

  1. fun traverseFileTree(filename: String) {
  2. val f = File(filename)
  3. val fileTreeWalk = f.walk()
  4. fileTreeWalk.iterator().forEach { println(it.absolutePath) }
  5. }

测试代码:

  1. @Test fun testTraverseFileTree() {
  2. KFileUtil.traverseFileTree(".")
  3. }

运行上面的测试代码,它将输出当前目录下的所有子目录及其文件。

我们还可以遍历当前文件下面所有子目录文件,存入一个 Iterator<File> 中

  1. fun getFileIterator(filename: String): Iterator<File> {
  2. val f = File(filename)
  3. val fileTreeWalk = f.walk()
  4. return fileTreeWalk.iterator()
  5. }

我们遍历当前文件下面所有子目录文件,还可以根据条件过滤,并把结果存入一个 Sequence

  1. fun getFileSequenceBy(filename: String, p: (File) -> Boolean): Sequence<File> {
  2. val f = File(filename)
  3. return f.walk().filter(p)
  4. }

测试代码:

  1. @Test fun testGetFileSequenceBy() {
  2. val fileSequence1 = KFileUtil.getFileSequenceBy(".", {
  3. it.isDirectory
  4. })
  5. fileSequence1.forEach { println("fileSequence1: ${it.absoluteFile} ") }
  6. val fileSequence2 = KFileUtil.getFileSequenceBy(".", {
  7. it.isFile
  8. })
  9. fileSequence2.forEach { println("fileSequence2: ${it.absoluteFile} ") }
  10. val fileSequence3 = KFileUtil.getFileSequenceBy(".", {
  11. it.extension == "kt"
  12. })
  13. fileSequence3.forEach { println("fileSequence3: ${it.absoluteFile} ") }
  14. }

在工程中运行上面的测试代码,它将会有类似下面的输出:

  1. ...
  2. ...
  3. fileSequence3: /Users/jack/kotlin/chapter15_file_io/./src/main/kotlin/com/easy/kotlin/fileio/KFileUtil.kt
  4. fileSequence3: /Users/jack/kotlin/chapter15_file_io/./src/main/kotlin/com/easy/kotlin/fileio/KNetUtil.kt
  5. fileSequence3: /Users/jack/kotlin/chapter15_file_io/./src/main/kotlin/com/easy/kotlin/fileio/KShellUtil.kt
  6. fileSequence3: /Users/jack/kotlin/chapter15_file_io/./src/test/kotlin/com/easy/kotlin/fileio/KFileUtilTest.kt